/**
 * 
 */

package com.wutianyi.taskqueue.queue.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.wutianyi.taskqueue.dataobject.TaskQueueDO;
import com.wutianyi.taskqueue.queue.Handler;
import com.wutianyi.taskqueue.queue.TaskQueue;
import com.wutianyi.taskqueue.queue.persistent.DBPersistent;
import com.wutianyi.taskqueue.queue.persistent.impl.DBPersistentImpl;

/**
 * @author wutianyi
 * 
 */
public class TaskQueueHandler implements Handler {

	private static Logger				logger	= Logger.getLogger(TaskQueueHandler.class);

	private DBPersistent<TaskQueueDO>	persistent;
	private TaskQueue<TaskQueueDO>		taskQueue;

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.duowan.zone.taskqueue.queue.Handler#addTask(com.duowan.zone.rpc.task.TaskDefinition)
	 */
	@Override
	public boolean addTask(TaskQueueDO task) {

		boolean result = persistent.addTask(task);
		if(!result) {
			// FIXME! 增加任务添加失败的错误
			return false;
		}
		result = taskQueue.offer(task);
		if(!result) {
			// FIXME!
			return false;
		}
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.duowan.zone.taskqueue.queue.Handler#batchAddTask(java.util.List)
	 */
	@Override
	public boolean batchAddTask(List<TaskQueueDO> tasks) {


		persistent.batchAddTasks(tasks);
		taskQueue.batchAddTask(tasks);

		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.duowan.zone.taskqueue.queue.Handler#listTask(int, int)
	 */
	@Override
	public List<TaskQueueDO> listTask(int count, int hideTime) {

		List<TaskQueueDO> tasks = taskQueue.drainTo(count, hideTime);
		return tasks;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.duowan.zone.taskqueue.queue.Handler#removeTask(java.lang.String)
	 */
	@Override
	public boolean removeTask(String taskId) {

		return taskQueue.removeTask(new TaskQueueDO(taskId));
	}

	public void setPersistent(DBPersistent<TaskQueueDO> persistent) {

		this.persistent = persistent;
	}

	public void setTaskQueue(TaskQueue<TaskQueueDO> taskQueue) {

		this.taskQueue = taskQueue;
	}

	public void printStatus() {

		DBPersistentImpl db = (DBPersistentImpl)persistent;
		logger.info("待持久化的任务的数量: " + db.getQueueSize());
		logger.info("带持久化的任务的索引的数量：" + db.getIndexSize());
		logger.info("已经持久化的数量：" + db.insertCount.get());

		logger.info("服务队列的数量：" + taskQueue.size());
	}
}
